﻿using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using XRM.Security.DataAccess.Context;
using XRM.Security.DataAccess.Helpers;
using XRM.Security.DataAccess.Models;
using XRM.Security.WebUI.Enums;
using XRM.Security.WebUI.Helpers;
using XRM.Security.WebUI.Models.SkziKind;

namespace XRM.Security.WebUI.Controllers
{
    [System.Web.Mvc.Authorize]
    public class SkziKindController : BaseController
    {
        [System.Web.Mvc.Authorize(Roles = "Administrator, SkziKindViewer, SkziKindEditor")]
        public ActionResult Index()
        { 
            var skziKinds = SkziKindRepository.GetAll().Select(s => new SkziKindModel
                {
                    Id = s.SkziKindId,
                    FullName = s.FullName,
                    ShortName = s.ShortName,
                    OperationDocName = s.OperationDocName,
                    TechnikalDocName = s.TechnikalDocName,
                    RegistrNumber = s.RegistrNumber,
                    ReadOnly = s.IsDeleted
                }).ToList();
            return View(skziKinds);
        }
        
        [System.Web.Mvc.HttpGet]
        [System.Web.Mvc.Authorize(Roles = "Administrator, SkziKindViewer, SkziKindEditor")]
        public ActionResult Edit(int? id, int? userId)
        {
            SkziKindModel model = new SkziKindModel(id != null ? SkziKindRepository.Get(id) : null);

            if ((id != null) && (model.Id == null))
                throw new HttpException(404, "Вид СКЗИ не найден");
            else if ((id == null) && (!Permission.AllowSkziKindEdit()))
                throw new HttpException(404, "Вид СКЗИ не найден");

            model.ReadOnly = !Permission.AllowSkziKindEdit();
            if (userId.HasValue)
            {
                model.UserRegisterId = userId;
                model.RedirectToUserPage = true;
            }

            return View(model);
        }

        [System.Web.Mvc.HttpPost]
        [System.Web.Mvc.Authorize(Roles = "Administrator, SkziKindEditor")]
        public ActionResult Edit(SkziKindModel model)
        {
            if (!ModelState.IsValid)
            {
                ShowAlert(AlertType.Error, GetModelErrors());
                return View(model);
            }

            string checkValue = model.ShortName;
            if (SkziKindRepository.GetAll(x => (x.ShortName.ToLower().Equals(checkValue) && (x.SkziKindId != model.Id))).Actual().Any())
            {
                ShowAlert(AlertType.Error, string.Format("Вид СКЗИ с кратким названием '{0}' уже существует", model.ShortName));
                return View(model);
            }
            checkValue = model.RegistrNumber;
            if (SkziKindRepository.GetAll(x => (x.RegistrNumber.ToLower().Equals(checkValue) && (x.SkziKindId != model.Id))).Actual().Any())
            {
                ShowAlert(AlertType.Error, string.Format("Вид СКЗИ с регистрационным номером '{0}' уже существует", model.RegistrNumber));
                return View(model);
            }
            foreach (var item in model.SertificateFsbList)
            {
                checkValue = item.Name;
                if (SertificateFsbRepository.Get(x => (x.Name.ToLower().Equals(checkValue) && (x.SkziKindId != model.Id))) != null)
                {
                    ShowAlert(AlertType.Error, string.Format("Сертификат ФСБ '{0}' уже существует", item.Name));
                    return View(model);
                }
            }
            foreach (var item in model.SertificateFstkList)
            {
                checkValue = item.Name;
                if (SertificateFstkRepository.Get(x => (x.Name.ToLower().Equals(checkValue) && (x.SkziKindId != model.Id))) != null)
                {
                    ShowAlert(AlertType.Error, string.Format("Сертификат ФСТЭК '{0}' уже существует", item.Name));
                    return View(model);
                }
            }


            SkziKind SkziKind = new SkziKind();
            if (model.IsEdit)
                SkziKind = SkziKindRepository.Get(model.Id);
            SkziKind.FullName = model.FullName;
            SkziKind.ShortName = model.ShortName;
            SkziKind.RegistrNumber = model.RegistrNumber;
            SkziKind.OperationDocName = model.OperationDocName;
            SkziKind.TechnikalDocName = model.TechnikalDocName;

            // Серты из бд, которых нет в модели - удаляем
            SkziKind.SertificateFsbs.Where(x => !model.SertificateFsbList.Any(x2 => x.SertificateFsbId.Equals(x2.Id ?? -1))).ToList().ForEach(a => SertificateFsbRepository.Delete(SertificateFsbRepository.Get(a.SertificateFsbId)));
            SkziKind.SertificateFstks.Where(x => !model.SertificateFstkList.Any(x2 => x.SertificateFstkId.Equals(x2.Id ?? -1))).ToList().ForEach(a => SertificateFstkRepository.Delete(SertificateFstkRepository.Get(a.SertificateFstkId)));

            foreach (var item in model.SertificateFsbList)
            {
                SertificateFsb sert = SkziKind.SertificateFsbs.SingleOrDefault(x => x.SertificateFsbId.Equals(item.Id ?? -1));
                if (sert != null)
                    sert.Name = item.Name;
                else
                    SkziKind.SertificateFsbs.Add(new SertificateFsb { Name = item.Name });
            }

            foreach (var item in model.SertificateFstkList)
            {
                SertificateFstk sert = SkziKind.SertificateFstks.SingleOrDefault(x => x.SertificateFstkId.Equals(item.Id ?? -1));
                if (sert != null)
                    sert.Name = item.Name;
                else
                    SkziKind.SertificateFstks.Add(new SertificateFstk { Name = item.Name });
            }

            if (model.IsEdit)
            {
                SkziKindRepository.Update(SkziKind);
                ShowAlert(AlertType.Success, "Вид СКЗИ отредактирован успешно");
            }
            else
            {
                SkziKindRepository.Add(SkziKind);
                ShowAlert(AlertType.Success, "Вид СКЗИ создан успешно");
            }

            if (!model.RedirectToUserPage)
                return RedirectToAction("Index");
            else
                return Redirect(Url.Action("Edit", "UserRegister", new { id = model.UserRegisterId }) + "#divSczi");

        }

        [System.Web.Mvc.Authorize(Roles = "Administrator, SkziKindEditor")]
        public ActionResult Delete(int id)
        {
            var skziKind = SkziKindRepository.Get(id);
            if (skziKind == null)
                throw new HttpResponseException(HttpStatusCode.BadRequest);

            if ( UserSkziRepository.GetAll( s => s.SkziKindId == id && s.DeleteDate == null ).Any() )
            {
                ShowAlert( AlertType.Error, string.Format("Невозможно удалить {0} из справочника, т.к. на текущий момент данный вид СКЗИ установлен у пользователей.", skziKind.ShortName) );
            }
            else
            {
                skziKind.IsDeleted = true;
                SkziKindRepository.Update( skziKind );
                ShowAlert( AlertType.Success, "Вид СКЗИ удален успешно" );
            }
            return RedirectToAction("Index");
        }
    }
}
